package scales.xml.trax
import javax.xml.transform.Source
import javax.xml.transform.stax._
import javax.xml.transform.sax._
import scales.utils._
import scales.xml.parser.sax.Handler
import scales.xml.parser.strategies.{PathOptimisationStrategy, OptimisationToken}
import scales.xml.{Doc, DocLike, EmptyDoc, PullType, XmlTree, streamOr, convertToStream, asString, ScalesXml}
import scales.xml.impl.Versions
import scales.xml.serializers.SerializeableXml
case class ScalesResult[Token <: OptimisationToken](strategy : PathOptimisationStrategy[Token] = scales.xml.defaultPathOptimisation) extends SAXResult(new Handler[Token](strategy)(ScalesXml.defaultVersion)) {
def doc = {
val handler = getHandler.asInstanceOf[Handler[Token]]
Doc(handler.getBuf.tree
, handler.getProlog, handler.getEnd)
}
}
case class ScalesSource(stream : Iterator[PullType], documentLike : DocLike = EmptyDoc()) extends StAXSource (
new ScalesStreamReader() {
val itr = stream
val docLike = documentLike
}
)
trait TraxConversionImplicits {
implicit def treeToSource( tree : XmlTree )(implicit serf: scales.xml.serializers.SerializerFactory, sf : SerializeableXml[XmlTree]) : Source =
streamOr( tree, ScalesSource(convertToStream(tree)))
implicit def docToSource( doc : Doc )(implicit serf: scales.xml.serializers.SerializerFactory, sf : SerializeableXml[Doc]) : Source =
streamOr( doc, ScalesSource(convertToStream(doc.rootElem), doc))
}
trait TraxSourceConversions {
def convertToStream(tree : XmlTree) : Iterator[PullType] = new TreeIterable(tree)
def asStreamSource[T]( xml : T )(implicit serf: scales.xml.serializers.SerializerFactory, serXml: SerializeableXml[T]) : Source = {
val str = asString(xml)
new javax.xml.transform.stream.StreamSource(new java.io.StringReader(str))
}
def streamOr[T]( xml : T , f : => Source)(implicit serf: scales.xml.serializers.SerializerFactory, serXml: SerializeableXml[T]) : Source =
if (Versions.traxSourceShouldSerialize)
asStreamSource(xml)
else
f
}